package com.jiaodacailei.ttv.md.util;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;

import java.io.IOException;
import java.io.InputStream;

public class PdfExporter {

    public static void main(String[] args) {
        String longContent = "这是一个非常长的字符串内容，如果它太长而无法适应单个页面宽度，\n那么PDFBox将会自动换行并将文本分为多个段落。这使得文本可以适应页面的宽度，并且不会溢出页面。";

        try {
            // 创建新的PDF文档
            PDDocument document = new PDDocument();
            PDPage page = new PDPage(PDRectangle.A4);
            document.addPage(page);

            // 创建PDF页面内容流
            PDPageContentStream contentStream = new PDPageContentStream(document, page);

            // 设置Noto字体（包括中文和日文）
            // 使用当前类的ClassLoader来加载资源
            ClassLoader classLoader = PdfExporter.class.getClassLoader();
            InputStream inputStream = classLoader.getResourceAsStream("NotoSansSC-Regular.ttf");
            PDType0Font notoFont = PDType0Font.load(document, inputStream);

            // 设置字体和字号
            contentStream.setFont(notoFont, 12);

            // 设置页面宽度和边距
            float pageWidth = PDRectangle.A4.getWidth();
            float margin = 50;
            float yPosition = page.getMediaBox().getHeight() - margin - 50;
            float textWidth = pageWidth - 2 * margin;

            // 拆分文本成段落并进行自动换行
            String[] paragraphs = longContent.split("\n");
            // 在循环外部设置行高
            float lineHeight = 15;
            // 在循环迭代中使用行高来调整yPosition
            for (String paragraph : paragraphs) {
                String[] lines = paragraph.split("\\n");
                for (String line : lines) {
                    float stringWidth = notoFont.getStringWidth(line) / 1000 * 12;
                    float availableWidth = textWidth;

                    while (stringWidth > availableWidth) {
                        line = line.substring(0, line.length() - 1);
                        stringWidth = notoFont.getStringWidth(line) / 1000 * 12;
                    }

                    contentStream.beginText();
                    contentStream.newLineAtOffset(margin, yPosition);
                    contentStream.showText(line);
                    contentStream.endText();
                    yPosition -= lineHeight; // 使用行高来调整yPosition
                }
                yPosition -= lineHeight; // 在段落之间添加间距
            }

            // 关闭内容流
            contentStream.close();

            // 保存PDF文件
            document.save("test.pdf");

            // 关闭PDF文档
            document.close();

            System.out.println("PDF文件已导出成功。");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
